package main

import (
	"database/sql"
	"fmt"
	"log"
	"time"

	_ "github.com/go-sql-driver/mysql"
)

var db *sql.DB

// func init() {
// 	var err error
// 	db, err = sql.Open("mysql", "jin:jin@tcp(localhost:3306)/test")
// 	if err != nil {
// 		log.Fatal(err)
// 	}
// 	// 参看README.md https://github.com/go-sql-driver/mysql#usage
// 	db.SetConnMaxLifetime(time.Second * 30) // 超时时间
// 	db.SetMaxOpenConns(200)                 // 设置最大连接数，默认为0表示不限制
// 	db.SetMaxIdleConns(10)                  // 设置空闲连接数
// }

type Emp struct { // 和字段对应的变量或结构体定义，最好和数据库中字段顺序对应
	emp_no     int
	birth_date string
	first_name string
	last_name  string
	gender     int16
	hire_date  string
}

func main() {
	stmt, err := db.Prepare("select * from employees where emp_no > ?")
	if err != nil {
		log.Fatal(err)
	}
	defer stmt.Close()

	// 批量查询
	rows, err := stmt.Query(10018)
	if err != nil {
		log.Fatal(err)
	}
	defer rows.Close()

	emp := Emp{}
	for rows.Next() {
		err := rows.Scan(&emp.emp_no, &emp.birth_date, &emp.first_name,
			&emp.last_name, &emp.gender, &emp.hire_date) // 取字
		if err != nil {
			log.Fatal(err)
		}
		fmt.Println(emp)
		fmt.Printf("%T %[1]v\n", emp.birth_date)
		t, err := time.Parse("2006-01-02", emp.birth_date) // 时间解析
		if err != nil {
			log.Fatal(err)
		}
		fmt.Printf("%T %[1]v\n", t)
	}
	fmt.Println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")

	// 单行查询
	row := db.QueryRow("select * from employees where emp_no = ?", 10010)
	err = row.Scan(&emp.emp_no, &emp.birth_date, &emp.first_name,
		&emp.last_name, &emp.gender, &emp.hire_date) //分段取
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(emp)
}
